/**************************************
 * 加热平台
 * 面相对象思想
 * 构建一个对象---加热板
 *
 * ************************************/

#ifndef HEATING_H
#define HEATING_H

#include "main.h"
#include "pid.h"

#define HEATING_TIME_MAX  (8 * 60 * 60)            	// 最长加热时间 8小时
#define HEATING_TEMP_MAX  230                     	// 最长加热温度 150度
#define TEMP_150              150           		// 保护温度 150度
#define WORK_TIME_MAX         (10 * 60)      		// 工作时间 10分钟

typedef struct
{
	uint8_t power : 7;	// 加热功率 0-100%
	uint8_t state : 1;	// 加热状态 0-停止 1-加热中

	uint8_t heating_mode : 1;	// 加热模式 0-恒温度 1-恒功率
	uint8_t heating_power :7;
	
	uint8_t power_max;	// 最大加热功率 0-100%

	uint8_t set_temp;		// 设置加热板温度
	signed char adjust_temp;	// 调整温度
	uint8_t actual_temp;	// 实际加热板温度
	uint16_t time;		// 加热时间 单位: s
	uint16_t work_time;	// 累计加热时间 单位: s
	uint16_t set_temp_AD;	// 设置加热板温度AD值
	uint16_t actual_temp_AD;	// 实际加热板温度AD值

	const uint16_t *temp_list;	// 温度列表 单位: 摄氏度

	IncrementalPIController * control_pid;

} Heating_Type;



// 初始化
void Heating_Init(Heating_Type *self, const uint16_t *temptab);

// 加热
void Heating_Start(Heating_Type *self);

// 停止加热
void Heating_Stop(Heating_Type *self);

// 加热功率设置
void Heating_Set_Power(Heating_Type *self, uint8_t power);

// 加热温度设置
uint8_t Heating_Set_Temp(Heating_Type *self, uint8_t temp);

// 加热时间设置
void Heating_Set_Time(Heating_Type *self, uint16_t time);

// 加热时间获取
uint16_t Heating_Get_Time(Heating_Type *self);

// 加热状态获取
uint8_t Heating_Get_State(Heating_Type *self);

// 累计加热时间获取
uint16_t Heating_Get_Work_Time(Heating_Type *self);

void Heating_deal_100ms(Heating_Type *self);

void Heating_set_adjust_temp(Heating_Type *self, signed char temp);

signed char Heating_get_adjust_temp(Heating_Type *self);

void Heating_Clear_Time(Heating_Type *self);

void Heating_set_power_max(Heating_Type *self, uint8_t power);


#endif
